/**
 * tree key类型
 */
export type Key = string | number

/**
 * 单个树节点
 */
export interface TreeNode<Raw extends Record<string, any>> {
  // 唯一key
  key: Key
  // 显示，筛选用
  label: string
  // 原数据
  raw: Raw
  // 代表数据层级
  level: number
  // 下标
  index: number
  // 父节点
  parent?: TreeNode<Raw>
  // 是否禁用
  disabled: boolean
  // 是否是最后的子节点
  isLeaf: boolean
  // 从根节点开始key路径
  path: Key[]
  // 对树本身的缓存
  siblings: Array<TreeNode<Raw>>
  // 子节点
  children?: Array<TreeNode<Raw>>
  [key: string]: any
}

/**
 * 树缓存类型
 */
export interface TreeCache<Raw extends Record<string, any>> {
  key: Map<Key, TreeNode<Raw>>

  [key: string]: any
}

/**
 * 创建 void tree 入参
 */
export interface CreateTreeNodeOption<Raw extends Record<string, any>> {
  // 指定数据key解析规则
  key?: (node: Raw) => Key
  // 指定数据disabled解析规则
  disabled?: (node: Raw) => boolean
  // 指定数据children解析规则
  children?: (node: Raw) => Array<Raw> | undefined
  // 指定数据label解析规则
  label?: (node: Raw) => string
  // 指定数据初始层级
  level?: number
  // 原数据
  raw: Array<Raw>
  /**@internal*/
  parent?: TreeNode<Raw>
  // 自定义缓存
  customCache?: Record<string, (node: TreeNode<Raw>, cache: any) => any>
  // 自定义缓存初始值
  customCacheInit?: Record<string, () => any>
  // 自定义递归中的行为
  forEach?: (node: TreeNode<Raw>) => any
}

/**
 * 由扁平数组转换而来的树状结构
 */
export interface ListTreeNode<Raw extends Record<string, any>> {
  _key: Key
  _label: string
  _parentKey?: Key
  _disabled: boolean
  _children?: Array<ListTreeNode<Raw>>
}

/**
 * 由扁平数组创建 void tree 入参
 */
export interface CreateTreeNodeOptionFormList<Raw extends Record<string, any>>
  extends CreateTreeNodeOption<Raw> {
  // 扁平数组树状转换负责
  parentKey?: (node: Raw) => Key
  // 将未匹配 parentKey 作为顶层 父级
  makeNomatchParentToTop?: boolean
}
